home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / text / hyper / hsc_source.lha / source / hsc / status.c < prev    next >
C/C++ Source or Header  |  1996-09-09  |  5KB  |  239 lines

  1. /*
  2.  * hsc/status.c
  3.  *
  4.  * status message functions for hsc
  5.  *
  6.  * Copyright (C) 1995,96  Thomas Aglassinger
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  *
  22.  * updated:  9-Sep-1996
  23.  * created: 30-Jul-1995
  24.  *
  25.  */
  26.  
  27. /*
  28.  * local includes
  29.  */
  30. #include "hsc/global.h"
  31.  
  32. #define NOEXTERN_HSC_STATUS
  33. #include "hsc/status.h"
  34.  
  35. #include "ugly/returncd.h"
  36.  
  37. LONG disp_status = STATUS_LINE; /* mode for status message */
  38.  
  39. static size_t prev_stmsg_len = 0;       /* length of previos status message */
  40. static ULONG prev_status_line = 0;      /* previous line num in input file */
  41.  
  42. #define ST_LINE_QUANTUM 25      /* num of lines that have to be processed */
  43.                             /* before a status message is printed */
  44.  
  45. #define MAX_STATUSLEN 160
  46. static STRARR status_buf[MAX_STATUSLEN + 2];    /* buffer for status messages */
  47.  
  48. /*
  49.  * set_return_code
  50.  *
  51.  * Set new value for return-code of program. If the old retcode
  52.  * is greater than the new one, nothing is changed.
  53.  */
  54. VOID set_return_code(int newrc)
  55. {
  56.     if (newrc > return_code) {
  57. #if DEBUG_HSCPRE_RETCODE
  58.         fprintf(stderr, DHSC "returncode: set to %d\n", return_code);
  59. #endif
  60.         return_code = newrc;
  61.     }
  62. #if DEBUG_HSCPRE_RETCODE
  63.     else {
  64.         fprintf(stderr, DHSC "returncode: NOT set to %d (is: %d)\n",
  65.                 newrc, return_code);
  66.     }
  67. #endif
  68. }
  69.  
  70. /*
  71.  * status_msg
  72.  *
  73.  * display a status message
  74.  *
  75.  * params: s.....message to display
  76.  */
  77. VOID status_msg(STRPTR s)
  78. {
  79.     size_t new_stmsg_len = strlen(s);
  80.     size_t i;
  81.  
  82.     if (disp_status) {
  83.  
  84.         /* display message */
  85.         if (s[0])
  86.             fputs(s, stderr);
  87.  
  88.         /* clear tail of old message */
  89.         for (i = new_stmsg_len; i < prev_stmsg_len; i++)
  90.             fputs(" ", stderr);
  91.  
  92.         /* perform cr & flush stdder */
  93.         fputs("\r", stderr);
  94.         fflush(stderr);
  95.  
  96.         prev_stmsg_len = new_stmsg_len;
  97.  
  98.     }
  99. }
  100.  
  101. /*
  102.  * status_clear
  103.  *
  104.  * clear status message
  105.  */
  106. VOID status_clear(VOID)
  107. {
  108.     status_msg("");
  109. }
  110.  
  111. /*
  112.  * status_file_and_line
  113.  *
  114.  * copy status message for current file & line
  115.  * processing into status_buf[]
  116.  *
  117.  * NOTE: messages >79 chars are truncated
  118.  */
  119. static VOID status_file_and_line(HSCPRC * hp)
  120. {
  121.     STRPTR filename = hsc_get_file_name(hp);
  122.  
  123.     if (filename) {
  124.         /* create status-string */
  125.         /* NOTE: this is not done via sprintf(), because
  126.          *   no check for a too long string would be done */
  127.         strncpy(status_buf, filename, MAX_STATUSLEN);
  128.         strncat(status_buf, " (", MAX_STATUSLEN - strlen(status_buf));
  129.         strncat(status_buf, long2str(hsc_get_file_line(hp)),
  130.                 MAX_STATUSLEN - strlen(status_buf));
  131.         strncat(status_buf, ")", MAX_STATUSLEN - strlen(status_buf));
  132.     } else {
  133.         strcpy(status_buf, "");
  134.     }
  135.  
  136.     status_msg(status_buf);
  137. }
  138.  
  139. /*
  140.  * status_lf
  141.  *
  142.  * perform a linfeed with status messages
  143.  * (old message will stay visible)
  144.  */
  145. VOID status_lf(VOID)
  146. {
  147.     if (disp_status) {
  148.  
  149.         fputs("\n", stderr);
  150.         prev_status_line = 0;
  151.  
  152.     }
  153. }
  154.  
  155. /*
  156.  * status_file_end
  157.  *
  158.  * hsc-callback for file fully processed: display
  159.  * file and total number of line, perform liefeed
  160.  */
  161. VOID status_file_begin(HSCPRC * hp, STRPTR filename)
  162. {
  163.     if (filename) {
  164.         /* create status-string: "<filename> (reading)" */
  165.         /* NOTE: this is not done via sprintf(), because
  166.          *   no check for a too long string would be done */
  167.         strncpy(status_buf, filename, MAX_STATUSLEN);
  168.         strncat(status_buf, " (reading)", MAX_STATUSLEN - strlen(status_buf));
  169.         status_msg(status_buf);
  170.     }
  171. }
  172.  
  173. /*
  174.  * status_file_end
  175.  *
  176.  * hsc-callback for file fully processed: display
  177.  * file and total number of line, perform liefeed
  178.  */
  179. VOID status_file_end(HSCPRC * hp)
  180. {
  181.     status_file_and_line(hp);
  182.     status_msg(status_buf);
  183.     status_lf();
  184. }
  185.  
  186. /*
  187.  * status_line
  188.  */
  189. VOID status_line(HSCPRC * hp)
  190. {
  191.     if (disp_status_line
  192. #if 1
  193.     /* set this to '0' to see every line displayed in status */
  194.         && ((hsc_get_file_line(hp) - prev_status_line) > ST_LINE_QUANTUM)
  195. #endif
  196.         ) {
  197.  
  198.         status_file_and_line(hp);
  199.         status_msg(status_buf);
  200.         prev_status_line = hsc_get_file_line(hp);
  201.  
  202.     }
  203. }
  204.  
  205. /*
  206.  * status_misc
  207.  *
  208.  * display misc. status messages
  209.  */
  210. VOID status_misc(HSCPRC * hp, STRPTR s)
  211. {
  212.     if (disp_status_verbose) {
  213.  
  214.         strcpy(status_buf, "");
  215. #if 0
  216.         status_file_and_line(hp);
  217. #endif
  218.         strncat(status_buf, s, MAX_STATUSLEN - strlen(status_buf));
  219.         status_msg(status_buf);
  220.         status_lf();
  221.  
  222.     }
  223. }
  224.  
  225. /*
  226.  * status_error
  227.  *
  228.  * display error status messages
  229.  */
  230. VOID status_error(STRPTR s)
  231. {
  232.     strncpy(status_buf, "*** ", MAX_STATUSLEN);
  233.     strncat(status_buf, s, MAX_STATUSLEN - strlen(status_buf));
  234.     status_msg(status_buf);
  235.     status_lf();
  236.     set_return_code(RC_ERROR);
  237. }
  238.  
  239.